

#ifndef WOWSERVER_SINGLETON_H
#define WOWSERVER_SINGLETON_H



namespace Apo
{

	/// Should be placed in the appropriate .cpp file somewhere
//  #define initialiseSingleton( type ) \
//  	template <> type * ApoSingleton < type > :: mSingleton = 0
//  
//  	/// To be used as a replacement for initialiseSingleton( )
//  	///  Creates a file-scoped ApoSingleton object, to be retrieved with getSingleton
//  #define createFileSingleton( type ) \
//  	initialiseSingleton( type ); \
//  	type the##type
//  
//  	template < class type > class SERVER_DECL ApoSingleton {
//  	public:
//  		/// Constructor
//  		ApoSingleton( ) {
//  			/// If you hit this assert, this singleton already exists -- you can't create another one!
//  			WPAssert( mSingleton == 0 );
//  			mSingleton = static_cast<type *>(this);
//  		}
//  		/// Destructor
//  		virtual ~ApoSingleton( ) {
//  			mSingleton = 0;
//  		}
//  
//  		/// Retrieve the singleton object, if you hit this assert this singleton object doesn't exist yet
//  		static type & getSingleton( ) { WPAssert( mSingleton ); return *mSingleton; }
//  
//  		/// Retrieve a pointer to the singleton object
//  		static type * getSingletonPtr( ) { return mSingleton; }
//  
//  	protected:
//  
//  		/// ApoSingleton pointer, must be set to 0 prior to creating the object
//  		static type * mSingleton;
//  	};
}
#endif

